package Annotation;

import java.lang.reflect.Field;

/**
 * @Author shangchao
 * @Date 2020/9/25 19:28
 */
public class SimpleContainer {
    public static <T> T getInstance(Class<T> cls){
        try{
            T obj = cls.newInstance();
            //获取该对象的字段，判断是否有字段需要容器注入实例对象
            Field[] fields = cls.getDeclaredFields();
            for (Field f : fields){
                //如果该字段SimpleInject注解，则需要容器自动创建一个实例对象，赋值给该字段
                if (f.isAnnotationPresent(SimpleInject.class)){
                    if (!f.isAccessible()){
                        f.setAccessible(true);
                    }
                    Class<?> fieldCls = f.getType();
                    //递归的解决依赖注入
                    f.set(obj, getInstance(fieldCls));
                }
            }
            return obj;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
}
